from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QAudioOutput
from PyQt5.QtCore import Qt, QUrl, QThread, pyqtSignal, QIODevice, QByteArray, QTimer, QSettings
from PyQt5.QtCharts import QChart, QBarSeries, QBarSet, QCategoryAxis, QValueAxis
import os
import configparser
import sqlite3
from network.lyrics import 歌词获取器
from network.cloud import 云同步管理

class 播放模式:
    """播放模式枚举类型"""
    列表循环 = 0
    单曲循环 = 1
    随机播放 = 2

class 家长控制模块:
    """实现家长控制功能，包括时间限制、内容过滤和使用报告生成"""
    def __init__(self, 播放器实例):
        self.播放器 = 播放器实例
        self.会话时间限制 = 1800  # 默认30分钟
        self.剩余时间 = self.会话时间限制
        self.敏感词库 = self.加载敏感词库()
        
        # 初始化定时器
        self.会话定时器 = QTimer()
        self.会话定时器.timeout.connect(self.更新剩余时间)
        self.会话定时器.start(1000)  # 每秒更新一次
    
    def 加载敏感词库(self):
        """加载敏感词数据库（示例实现）"""
        try:
            conn = sqlite3.connect('家长控制.db')
            c = conn.cursor()
            c.execute('''CREATE TABLE IF NOT EXISTS 敏感词
                         (id INTEGER PRIMARY KEY, 词汇 TEXT)''')
            # 示例数据
            c.execute("INSERT OR IGNORE INTO 敏感词 (词汇) VALUES ('暴力')")
            c.execute("INSERT OR IGNORE INTO 敏感词 (词汇) VALUES ('成人')")
            conn.commit()
            
            c.execute("SELECT 词汇 FROM 敏感词")
            return [row[0] for row in c.fetchall()]
        except Exception as e:
            print(f'加载敏感词库失败: {e}')
            return []
        finally:
            conn.close()
    
    def 检查内容安全(self, 文本):
        """检查文本是否包含敏感词"""
        return any(词汇 in 文本 for 词汇 in self.敏感词库)
    
    def 设置会话时间(self, 秒数):
        """设置会话时间限制"""
        self.会话时间限制 = 秒数
        self.剩余时间 = 秒数
    
    def 更新剩余时间(self):
        """更新剩余时间并触发警告"""
        if self.剩余时间 > 0:
            self.剩余时间 -= 1
            if self.剩余时间 == 60:  # 剩余1分钟时警告
                self.播放器.显示警告('注意', '会话即将结束')
            return
        
        # 时间到，暂停播放
        self.会话定时器.stop()
        self.播放器.pause()
        self.播放器.显示消息('会话结束', '已达到预设使用时间限制')
    
    def 生成使用报告(self):
        """生成可视化使用报告"""
        # 示例数据 - 实际应从播放记录获取
        数据 = {
            '周一': 45,
            '周二': 30,
            '周三': 60,
            '周四': 45,
            '周五': 120
        }
        
        # 创建图表
        chart = QChart()
        series = QBarSeries()
        
        barSet = QBarSet('使用时间(分钟)')
        for 值 in 数据.values():
            barSet.append(값/60)  # 转换为分钟
        
        series.append(barSet)
        chart.addSeries(series)
        
        # 配置坐标轴
        axisX = QCategoryAxis()
        axisX.append(list(数据.keys()))
        chart.addAxis(axisX, Qt.AlignBottom)
        
        axisY = QValueAxis()
        axisY.setLabelFormat('%d 分钟')
        chart.addAxis(axisY, Qt.AlignLeft)
        
        return chart
    
    def 设置播放模式(self, 模式):
        """设置播放模式（0:列表循环 1:单曲循环 2:随机播放）"""
        self.播放模式 = 模式
        self.播放器.云同步管理.同步设置()  # 同步播放模式设置
    
    def 获取当前模式(self):
        """获取当前播放模式"""
        return self.播放模式
    
    def 获取播放列表(self):
        """根据播放模式获取下一首歌曲"""
        if self.播放模式 == 播放模式.列表循环:
            return self._列表循环播放()
        elif self.播放模式 == 播放模式.单曲循环:
            return self._单曲循环播放()
        elif self.播放模式 == 播放模式.随机播放:
            return self._随机播放()
    
    def _列表循环播放(self):
        """列表循环模式实现"""
        # 示例实现
        return ['song1.mp3', 'song2.mp3', 'song3.mp3']
    
    def _单曲循环播放(self):
        """单曲循环模式实现"""
        # 示例实现
        return ['song1.mp3']
    
    def _随机播放(self):
        """随机播放模式实现"""
        # 示例实现
        import random
        return random.choice(['song1.mp3', 'song2.mp3', 'song3.mp3'])


class 音频播放器(QMediaPlayer):
    """核心音频播放模块，集成所有播放相关功能"""
    def __init__(self):
        super().__init__()
        
        # 初始化配置
        self.配置 = configparser.ConfigParser()
        self.配置.read('config.ini')
        
        # 初始化核心组件
        self.歌词获取器 = 歌词获取器(self)
        self.云同步管理 = 云同步管理(self)
        self.家长控制 = 家长控制模块(self)
        
        # 初始化内存缓存
        self.资源缓存 = QCache()
        self.歌词缓存大小 = 10  # 默认缓存10首歌词
        self.皮肤资源缓存大小 = 5  # 默认缓存5种皮肤
        
        # 启用GPU加速
        self.setAttribute(Qt.WA_TranslucentBackground, False)
        self.setRenderHint(QPainter.Antialiasing)
        self.setRenderHint(QPainter.TextAntialiasing)
        
        # 初始化播放模式
        self.播放模式 = 播放模式.列表循环
    
    def 加载歌曲(self, 歌曲路径):
        """加载歌曲：优先使用云端缓存，其次本地文件，最后尝试在线获取"""
        # 尝试从云端缓存获取
        if self.云端缓存:
            文件名 = os.path.basename(歌曲路径)
            歌曲ID = f'songs/{文件名}'  # 假设OSS中歌曲存储在songs目录下
            缓存数据 = self.云端缓存.获取歌曲(歌曲ID)
            
            if 缓存数据:
                # 将缓存数据写入临时文件供播放器使用
                temp_path = os.path.join('cache', 'temp', 文件名)
                os.makedirs(os.path.dirname(temp_path), exist_ok=True)
                with open(temp_path, 'wb') as f:
                    f.write(缓存数据)
                歌曲路径 = temp_path
            
        elif os.path.exists(歌曲路径):
            # 使用本地文件
            歌曲路径 = 歌曲路径
        else:
            # TODO: 实现从云端直接流式播放
            return False
            
        self.setMedia(QMediaContent(QUrl.fromLocalFile(歌曲路径)))
        self.加载歌词(歌曲路径)
        return True
    
    def 加载歌词(self, 歌曲路径):
        """优先使用本地歌词文件，不存在时尝试在线获取"""
        歌词路径 = os.path.splitext(歌曲路径)[0] + ".lrc"
        
        # 尝试加载本地歌词
        if os.path.exists(歌词路径):
            try:
                with open(歌词路径, 'r', encoding='utf-8') as f:
                    内容 = f.readlines()
                self.当前歌词 = [行.strip() for 行 in 内容 
                                if 行.strip() and not 行.startswith('[')]
                if not self.当前歌词:
                    self.当前歌词 = ["无歌词内容"] * 5
            except Exception as e:
                print(f"加载歌词失败: {e}")
                self.当前歌词 = ["加载失败"] * 5
            return
        
        # 尝试从内存缓存加载
        if self.资源缓存.contains(缓存键):
            self.当前歌词 = self.资源缓存[缓存键]
            return
        
        # 如果没有本地歌词，尝试在线获取
        文件名 = os.path.basename(歌曲路径)
        歌曲名, _ = os.path.splitext(文件名)
        歌手 = "未知歌手"  # 这里应根据实际元数据提取
        
        # 使用网络模块获取歌词
        if not self.歌词获取器.读取本地缓存(歌曲路径):
            self.歌词获取器.获取歌词(歌曲路径)
    
    def 设置皮肤(self, 主题):
        """应用界面主题并使用GPU加速渲染"""
        if 主题 == "深色主题":
            self.setStyleSheet("background-color: #2d2d2d; color: white;")
        elif 主题 == "粉色系":
            self.setStyleSheet("background-color: #ffe6f0; color: #8b0000;")
        else:
            self.setStyleSheet("")
        
        # 启用GPU加速的渲染策略
        self.setAttribute(Qt.WA_OpaquePaintEvent)
        self.setAttribute(Qt.WA_PaintOutsidePaintEvent)
    
    def 释放资源(self):
        """释放非必要资源"""
        self.资源缓存.clear()
        self.云同步管理.释放资源()
        self.播放器.releaseResources()
